package com.kuang.volatiledemo;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 问题：
 *      如果不加sychronized、Lock锁，怎么可以保证原子性?
 *      使用原子包装类解决  AtomicInteger num   Demo3
 */
public class Demo3 {

    // volatile 保证可见性,不保证原子性
    // AtomicInteger 原子包装类声明变量，保证原子性
    private static volatile AtomicInteger num = new AtomicInteger();

    public static void add(){
        num.incrementAndGet();
    }

    public static void main(String[] args) {
        // 20个线程，每个线程加到1000，预计num=2w
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    add();
                }
            }).start();
        }

        // 打印出20个线程执行完的num
        while (Thread.activeCount() > 2){ // main,gc
            Thread.yield();
        }
        System.out.println("num=" + num);
    }
}
